/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pl.tewi.jeeunit.commands;

import javax.transaction.Status;
import javax.transaction.UserTransaction;
import org.junit.runners.model.FrameworkMethod;
import org.junit.runners.model.Statement;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import pl.tewi.annotations.Transactional;
import pl.tewi.commands.AbstractFrameworkCommand;
import pl.tewi.commands.FrameworkCommand;
import pl.tewi.contexts.ApplicationServerContext;
import pl.tewi.controller.ServerControllerFactory;

/**
 * Statement rozpoczynający transakcję. Transakcję należy pobrać z serwera 
 * aplikacyjnego. Kłopotem jest tutaj różne nazewnistwo sotosowane w przypadku
 * serwerów aplikacyjnych w jndi. Dla glassfish jest to UserTransaction
 * @author tewi
 */
public final class EndTransaction extends AbstractFrameworkCommand {

    private static final Logger LOGGER = LoggerFactory.getLogger(EndTransaction.class.getName());
    private final FrameworkMethod method;
    private BeginTransaction transaction;

    /**
     * 
     * @param statement
     * @param context
     * @param method
     */
    public EndTransaction(FrameworkCommand statement, ApplicationServerContext context, FrameworkMethod method) {
        super(statement, context);
        this.method = method;
    }

    @Override
    public void evaluate() throws Throwable {
        LOGGER.debug("Evaluating test method");
        fNext.evaluate();
        //zatwierdź transakcję
        Transactional transactional = method.getAnnotation(Transactional.class);
        if (transactional != null) {
            UserTransaction tx = ServerControllerFactory.getServerController(applicationServerContext).getCurrentTransaction();
            if (tx.getStatus() == Status.STATUS_ACTIVE) {
                tx.commit();
            }
        }
        LOGGER.debug("Evaluating EndTransaction");
    }

    /**
     * 
     * @param beginTransaction
     */
    public void setBeginTransaction(BeginTransaction beginTransaction) {
        transaction = beginTransaction;
    }
}
